<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 深拷贝 实现原型的继承 
        function deepCopy(obj) {
            var obj2 = Object.prototype.toString.call(obj) === "[object Array]" ? [] : {};
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) { // 判断是否是对象的自身属性
                    // obj[key] : 张三、20、{myname:"李四"}
                    if (typeof obj[key] === "object") {
                        // 证明键值是 对象或者是数组
                        // newobj = copy({myname:"李四"})
                        // obj['myobj'] = newobj
                        obj2[key] = deepCopy(obj[key]);
                    } else {
                        // 简单数据类型
                        obj2[key] = obj[key];
                    }
                }
            }
            return obj2
        }


      

        function Dad(name,age){
            this.name = name;
            this.age = age;
        }

        Dad.prototype.fn = function(){
            console.log("DadFn");
        }


        // 构造函数的继承 
        function Son(name,age){
            Dad.call(this,name,age)
            this.height = "178cm";
        } 

        // 继承原型 
        // Son.prototype = Dad.prototype;  // 会造成引用问题 
        Son.prototype = deepCopy(Dad.prototype);  // 深拷贝 父类的原型给子类原型 。 覆盖 Son.prototype.construtor 固有属性。
        Son.prototype.constructor = Son;  // 从新把constructor指向 Son构造函数；



        Son.prototype.fn = function(){
            console.log("sonFn");
        }

        var zhangsan = new Son("张三",50);
        // console.log(zhangsan);
        zhangsan.fn(); // 子类的方法


        var lisi  = new Dad("李四",40);
        lisi.fn();  // 父类的方法

    </script>
</body>
</html>